home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / brklyprl.lha / Comp / objcode.pl < prev    next >
Text File  |  1989-04-14  |  2KB  |  43 lines

  1.  
  2. /* Copyright (C) 1988, 1989 Herve' Touati, Aquarius Project, UC Berkeley */
  3.  
  4. /* Copyright Herve' Touati, Aquarius Project, UC Berkeley */
  5.  
  6. % Turn partial object code, which still contains the
  7. % hierarchy of goals and disjunctions, into a uniform list.
  8. % The control instructions for disjunctions are compiled and
  9. % the labels for the cut instructions are instantiated.
  10. objcode(PartObj, ObjCode) :-
  11.     xobjcode(PartObj, ObjCode-[], proc, _), !.
  12.  
  13. xobjcode([], Link-Link, _, _).
  14. xobjcode([cutd|RestCode], [cutd(CutLbl)|C]-Link, CutLbl, yes) :-
  15.     xobjcode(RestCode, C-Link, CutLbl, _).
  16. xobjcode([Code-L|RestCode], Code-Link, CutLbl, IsCut) :-
  17.     xobjcode(RestCode, L-Link, CutLbl, IsCut).
  18. xobjcode([(X;Choices)|RestCode],
  19.     [begin(disj),try(else,L1)|ChCode]-Link, CutLbl, IsCut) :-
  20.     xobjcode(X, ChCode-ChLink, L1, _),
  21.     ChLink=[execute(EndLbl),label(L1)|C3],
  22.     xdiscode(Choices, C3-L, EndLbl),
  23.     L = [end(disj)|NewL],
  24.     xobjcode(RestCode, NewL-Link, CutLbl, IsCut).
  25.  
  26. xdiscode((X;Choices), [retry(else,L2)|ChCode]-Link, EndLbl) :-
  27.     xobjcode(X, ChCode-ChLink, L2, _),
  28.     ChLink=[execute(EndLbl),label(L2)|C3],
  29.     xdiscode(Choices, C3-Link, EndLbl).
  30. xdiscode(LastChoice, Code-Link, EndLbl) :-
  31.     xobjcode(LastChoice, ChCode-ChLink, CutLbl, IsCut),
  32.     lastchoice(IsCut,CutLbl,EndLbl,Code,ChCode,ChLink,L),
  33.     L=[label(EndLbl)|Link].
  34.  
  35.     % Handle case of cut in last choice:
  36.     lastchoice(IsCut,CutLbl,EndLbl,Code,ChCode,ChLink,L) :-
  37.         IsCut==yes, !,
  38.         Code=[retry(else,CutLbl)|ChCode],
  39.         ChLink=[execute(EndLbl),label(CutLbl),trust(else,fail),fail/0|L].
  40.     lastchoice(IsCut,CutLbl,EndLbl,Code,ChCode,ChLink,L) :-
  41.         Code=[trust(else,fail)|ChCode],
  42.         ChLink=L.
  43.